21.3 Zugriff auf die Subfenster
 
Sehen Sie sich noch einmal die Anweisung an, mit der neue Subfenster erstellt und angezeigt werden:
| SubForm frm = new SubForm();
|
| frm.MdiParent = this;
|
| frm.Show();
|
Wird das erste Subfenster erzeugt, kann dieses mit frm angesprochen werden. Mit dem Erzeugen des zweiten Subfensters wird die Objektvariable frm »umgebogen« und zeigt auf die Startadresse des zweiten Subfensters. Das erste wird zwar unter frm nicht mehr referenziert, ist aber dennoch weiterhin im Hauptfenster zu sehen, weil das Objekt nicht zerstört worden ist. Jetzt stellt sich natürlich die Frage, wie auf die einzelnen Subfenster zugegriffen werden kann.
Es erstaunt sicherlich nicht, dass die Referenzen aller geöffneten Subfenster in einem Array verwaltet werden. Dieses Array kann über die Eigenschaft MdiChildren des MDI-Hauptfensters ausgewertet werden.
| public Form[] MdiChildren {get;}
|
Die Eigenschaft bietet sich auch dann an, wenn auf alle Subfenster dieselben Operationen ausgeführt werden müssen – beispielsweise um die darin enthaltenen Daten vor dem Schließen der Anwendung zu speichern.
Öffnet der Anwender die Subfenster Dokument 1... Dokument 10 und schließt ein oder mehrere, z.B. Dokument2 und Dokument7, hinterlässt dieses Array keine unbelegten Indizes und kann deshalb vom ersten bis zum letzten Index durchlaufen werden:
| for(int i = 0; i < this.MdiChildren.Length; i++) {
|
| // Anweisungen
|
| }
|
Die Überprüfung, ob der sich aktuell im Zugriff befindliche Index den Inhalt null aufweist, ist deshalb nicht notwendig.
21.3.1 Zugriff auf das aktive Subfenster
 
In der Menüleiste eines MDI-Hauptfensters findet man normalerweise immer die Menüpunkte Speichern und Speichern unter..., um die Eingaben im aktiven Subfenster zu sichern. Mit der Eigenschaft ActiveMdiChild des MDI-Hauptfensters können Sie sich dazu die Referenz auf das aktivierte MDI-Subfenster besorgen:
| public Form ActiveMdiChild {get;}
|
Nehmen wir an, dass das Subfenster eine Textbox enthält, deren Eigenschaft MultiLine=true gesetzt ist und, wie üblich bei einem Dokumentenfenster, den gesamten Clientbereich des Subfensters einnimmt. Mit
| SubForm frm = (SubForm)(this.ActiveMdiChild);
|
besorgen Sie sich die Referenz auf das aktive Subfenster. Weil der Rückgabewert von ActiveMdiChild vom Typ Form ist, muss vorher noch in den Typ des Subfensters konvertiert werden, hier also exemplarisch in SubForm.
Der Versuch, mit
| frm.textBox1.Text = ".......";
|
den Inhalt der Textbox des Subfensters auszuwerten, könnte allerdings mit einer Fehlermeldung des C#-Compilers enden. Der Grund dafür lässt sich sehr einfach finden. Wenn Sie nämlich mit der Unterstützung des Windows Forms-Designers die Textbox hinzugefügt haben, ist deren Deklaration private.
| private System.Windows.Forms.TextBox textBox1;
|
Sie müssen private mindestens durch internal ersetzen, um den Zugriff auch von außerhalb der Form zu gestatten.
| Der Zugriffsmodifizierer der Steuerelemente des Subfensters, auf die vom Hauptfenster aus zugegriffen wird, muss internal oder public sein. Im Eigenschaftsfenster können Sie die Zugriffsmodifizierer auch mit der Eigenschaft Modifiers passend einstellen.
|
Abhängig davon, unter welchen Rahmenbedingungen Sie auf ActiveMdiChild zugreifen, kann es erforderlich sein zu prüfen, ob überhaupt ein Subfenster geöffnet ist. Wenn aktuell kein MDI-Subfenster geöffnet ist, liefert die Eigenschaft ActiveMdiChild null zurück. Das sollten Sie daher zuvor unbedingt prüfen.
| if(this.ActiveMdiChild != null) {
|
| SubForm frm = (SubForm)(this.ActiveMdiChild);
|
| frm.textBox1.Text = ".......";
|
| }
|
21.3.2 Zugriff auf die Subfenster eines bestimmten Typs
 
MDI-Anwendungen haben meistens nur einen Subfenstertyp. Das schließt aber nicht die Möglichkeit aus, auch mehrere unterschiedliche zu verwalten. Da davon ausgegangen werden muss, dass zu einem gegebenen Zeitpunkt der Laufzeit konkrete Objekte beider Typen innerhalb des Hauptfensters geöffnet sein könnten, enthält auch das von MdiChildren zurückgelieferte Array beide Typen. Soll auf das Steuerelement eines bestimmten untergeordneten Fensters zugegriffen werden, muss daher zuerst eine Typüberprüfung mit dem is-Operator erfolgen.
| for(int i = 0; i < this.MdiChildren.Length; i++) {
|
| if (this.MdiChildren[i] is SubForm) {
|
| ((Form2)this.MdiChildren[i]).textBox1.Text = "...";
|
| }
|
| else if(this.MdiChildren[i] is SubForm2) {
|
| ...
|
| }
|
| }
|
|